#include "gc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 简单对象结构
typedef struct {
    int id;
    char* name;
    size_t name_len;
} SimpleObject;

// 扫描函数
void scan_simple_object(void* obj, void (*mark)(void*)) {
    SimpleObject* so = (SimpleObject*)obj;
    if (so->name) mark(so->name);
}

int main() {
    // 初始化GC
    if (GC_初始化() != GC_SUCCESS) {
        printf("GC初始化失败\n");
        return 1;
    }
    
    // 注册扫描函数
    GC_注册对象类型扫描(1, scan_simple_object);
    
    // 启用详细日志
    GC_设置是否启用详细日志(true);
    
    // 创建内存池
    if (!GC_创建内存池(1, 1024 * 1024, 1024 * 1024 * 10, 池类型_普通)) {
        printf("创建内存池失败\n");
        return 1;
    }
    
    printf("开始分配对象...\n");
    
    // 分配一些对象
    for (int i = 0; i < 100; i++) {
        // 使用内存池分配
        SimpleObject* obj = (SimpleObject*)gc_pool_alloc(1, sizeof(SimpleObject));
        if (!obj) {
            printf("分配对象失败\n");
            break;
        }
        
        obj->id = i;
        char name[32];
        snprintf(name, sizeof(name), "对象_%d", i);
        obj->name_len = strlen(name);
        obj->name = (char*)gc_pool_alloc(1, obj->name_len + 1);
        if (obj->name) {
            strcpy(obj->name, name);
        }
        
        // 设置对象类型
        GC_设置对象类型(obj, 1);
        
        // 标记为根对象
        GC_标记根对象(obj);
    }
    
    printf("执行GC...\n");
    GC_执行垃圾回收();
    
    // 获取内存池状态
    内存池 pool_info;
    GC_获取内存池状态信息(1, &pool_info);
    printf("内存池状态: ID=%d, 大小=%zu, 已使用=%zu, 访问计数=%u\n", 
           pool_info.ID, pool_info.大小, pool_info.已使用大小, pool_info.访问计数);
    
    // 清理内存池
    GC_内存池清理(1);
    
    // 关闭GC
    GC_关闭(true);
    
    printf("测试完成\n");
    return 0;
}